home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_jade.idb / usr / freeware / include / sp / lib / Group.h.z / Group.h
Encoding:
C/C++ Source or Header  |  1999-07-21  |  3.6 KB  |  164 lines

  1. // Copyright (c) 1994 James Clark
  2. // See the file COPYING for copying permission.
  3.  
  4. #ifndef Group_INCLUDED
  5. #define Group_INCLUDED 1
  6. #ifdef __GNUG__
  7. #pragma interface
  8. #endif
  9.  
  10. #include "Boolean.h"
  11. #include "ContentToken.h"
  12. #include "StringC.h"
  13. #include "MessageArg.h"
  14. #include "Owner.h"
  15. #include "Syntax.h"
  16. #include "Text.h"
  17.  
  18. #ifdef SP_NAMESPACE
  19. namespace SP_NAMESPACE {
  20. #endif
  21.  
  22. class GroupToken {
  23. public:
  24.   GroupToken() { }
  25.   enum Type {
  26.     invalid,
  27.     nameToken,
  28.     name,
  29.     dataTagLiteral,        // data tag (padding) template
  30.     dataTagGroup,
  31.     elementToken,
  32.     modelGroup,
  33.     pcdata,
  34.     dataTagTemplateGroup
  35.     };
  36.   Type type;
  37.   StringC token;        // name nameToken; with substitution
  38.   Owner<ModelGroup> model;
  39.   Owner<ContentToken> contentToken; // elementToken pcdata dataTagGroup
  40.   Text text;
  41.   Vector<Text> textVector;
  42. private:
  43.   GroupToken(const GroupToken &); // undefined
  44.   void operator=(const GroupToken &); // undefined
  45. };
  46.  
  47. class AllowedGroupTokens {
  48. public:
  49.   AllowedGroupTokens(GroupToken::Type,
  50.              GroupToken::Type = GroupToken::invalid,
  51.              GroupToken::Type = GroupToken::invalid,
  52.              GroupToken::Type = GroupToken::invalid);
  53.   Boolean groupToken(GroupToken::Type) const;
  54.   // modelGroup, dataTagTemplateGroup
  55.   GroupToken::Type group() const;
  56.   GroupToken::Type nameStart() const;
  57. private:
  58.   void allow(GroupToken::Type);
  59.   unsigned flags_;
  60. };
  61.  
  62. struct GroupConnector {
  63.   enum Type {
  64.     andGC,
  65.     orGC,
  66.     seqGC,
  67.     grpcGC,
  68.     dtgcGC
  69.   };
  70.   Type type;
  71. };
  72.  
  73. class AllowedGroupConnectors {
  74. public:
  75.   AllowedGroupConnectors(GroupConnector::Type);
  76.   AllowedGroupConnectors(GroupConnector::Type, GroupConnector::Type);
  77.   AllowedGroupConnectors(GroupConnector::Type, GroupConnector::Type,
  78.              GroupConnector::Type);
  79.   AllowedGroupConnectors(GroupConnector::Type, GroupConnector::Type,
  80.              GroupConnector::Type, GroupConnector::Type);
  81.   Boolean groupConnector(GroupConnector::Type) const;
  82. private:
  83.   void allow(GroupConnector::Type);
  84.   unsigned flags_;
  85. };
  86.  
  87. class AllowedGroupTokensMessageArg : public MessageArg {
  88. public:
  89.   AllowedGroupTokensMessageArg(const AllowedGroupTokens &allow,
  90.                    const ConstPtr<Syntax> &syntax);
  91.   MessageArg *copy() const;
  92.   void append(MessageBuilder &) const;
  93. private:
  94.   AllowedGroupTokens allow_;
  95.   ConstPtr<Syntax> syntax_;
  96. };
  97.  
  98. class AllowedGroupConnectorsMessageArg : public MessageArg {
  99. public:
  100.   AllowedGroupConnectorsMessageArg(const AllowedGroupConnectors &allow,
  101.                    const ConstPtr<Syntax> &syntax);
  102.   MessageArg *copy() const;
  103.   void append(MessageBuilder &) const;
  104. private:
  105.   AllowedGroupConnectors allow_;
  106.   ConstPtr<Syntax> syntax_;
  107. };
  108.  
  109. inline
  110. Boolean AllowedGroupTokens::groupToken(GroupToken::Type i) const
  111. {
  112.   return ((1 << i) & flags_) != 0;
  113. }
  114.  
  115. inline
  116. GroupToken::Type AllowedGroupTokens::group() const
  117. {
  118.   if (groupToken(GroupToken::modelGroup))
  119.     return GroupToken::modelGroup;
  120.   else if (groupToken(GroupToken::dataTagTemplateGroup))
  121.     return GroupToken::dataTagTemplateGroup;
  122.   else
  123.     return GroupToken::invalid;
  124. }
  125.  
  126. inline
  127. GroupToken::Type AllowedGroupTokens::nameStart() const
  128. {
  129.   if (groupToken(GroupToken::elementToken))
  130.     return GroupToken::elementToken;
  131.   else if (groupToken(GroupToken::nameToken))
  132.     return GroupToken::nameToken;
  133.   else if (groupToken(GroupToken::name))
  134.     return GroupToken::name;
  135.   else
  136.     return GroupToken::invalid;
  137. }
  138.  
  139. inline
  140. void AllowedGroupTokens::allow(GroupToken::Type t)
  141. {
  142.   flags_ |= (1 << t);
  143. }
  144.  
  145.  
  146. inline
  147. Boolean AllowedGroupConnectors::groupConnector(GroupConnector::Type c) const
  148. {
  149.   return (flags_ & (1 << c)) != 0;
  150. }
  151.  
  152. inline
  153. void AllowedGroupConnectors::allow(GroupConnector::Type c)
  154. {
  155.   flags_ |= (1 << c);
  156. }
  157.  
  158.  
  159. #ifdef SP_NAMESPACE
  160. }
  161. #endif
  162.  
  163. #endif /* not Group_INCLUDED */
  164.